Vamos a ver un ejemplo del uso de vectores: cómo girar el genoma de E. coli.
E. coli es una bacteria muy estudiada de la qual se conoce la secuencia de ADN (el genoma) entera. Se puede descargar de la web Real World Data Sets y tiene el nombre ecoli.txt.
El programa entero es este:
#include <iostream> #include <vector> #include <fstream> using namespace std; int main() { vector<char> genoma; ifstream ecoli("ecoli.txt"); char base; ecoli >> base; while (!ecoli.eof()) { genoma.push_back(base); ecoli >> base; } ofstream alreves("ecoli_r.txt"); int tam = genoma.size(); for (int i = 0; i < tam; i++) { alreves << genoma[tam - 1 - i]; if (i % 1024 == 1023) alreves << endl; } }
En este programa utilizamos el hecho de que los vectores se van haciendo grandes para no tener que preocuparnos por poner un tamaño inicial al vector genoma. Al declararlo así:
vector<char> genoma;
empieza vacío (si llamamos a size dará 0). Entonces en la primera parte (el primer while) hacemos un bucle que esencialmente llena el vector con los caracteres que sacamos del fichero ecoli.txt. Al hacer push_back el genoma va creciendo poco a poco. Así no hay que preocuparse por el tamaño que tenga (y puede ser muy grande).
Luego abrimos el fichero de salida ecoli_r.txt (de ecoli.txt al revés). Y hacemos un bucle que recorre las casillas del vector al revés, con la fórmula: tam - 1 - i. Eso empieza por la última casilla tam - 1 cuando i es 0, y acaba por la casilla 0 cuando i es tam - 1.
También se añade al fichero un endl cada 1024 caracteres, tal como el fichero original.
Haz un programa que lea una secuencia de enteros de un fichero numeros.txt (que puedes escribir tu mismo para probar) y los muestre por la pantalla al revés.
Haz un programa que lea las líneas de un fichero escrito.txt y lo muestre por pantalla al revés. Si el fichero escrito.txt contiene:
To be or not to be
el programa debe mostrar por pantalla:
be or not to To be
En preparación